import path from 'path'
/**
 * 所有的子集路由
 */
const getChildrenRoutes = (routes) => {
  const result = []
  routes.forEach(item => {
    if (item.children && item.children.length > 0) {
      result.push(...item.children)
    }
  })
  return result
}

//处理脱离层级的路由
export const filterRoutes = (routes) => {
  //获取到所有的子集路由
  const childrenRoutes = getChildrenRoutes(routes)
  //根据子集路由进行查重操作
  return routes.filter(item => {
    //根据item在childrenRoutes中进行查重 把所有重复的路由表剔除
    return !childrenRoutes.find(ele => {
      return ele.path === item.path
    })
  })
}

//判断值是否为空
function isNull(data) {
  if (!data) return true
  if (JSON.stringify(data) === '{}') return true
  if (JSON.stringify(data) === '[]') return true
  return false
}

//根据routes(filterRoutes)数据返回对应的menu数据规则
export const generateMenus = (routes, basePath = '') => {
  const result = [];
  //循环我们传递过来的路由参数 并进行判断
  routes.forEach(item => {
    // 如果item不存在children 也不存在meta 直接reutrn
    if (isNull(item.children) && isNull(item.meta)) return

    //如果存在children,不存在meta 那么迭代generateMenus 就是再次调用自己 并改变参数吧routes参数变更成item.children
    if (!isNull(item.children) && isNull(item.meta)) {
      result.push(...generateMenus(item.children))
      return
    }

    //如果不存在children存在meta 或者|| 存在children 并且也存在meta
    //因为最终的menu需要进行跳转 此时我们需要合并path 作为跳转路径
    //path.resolve() 该方法将一些的 路径/路径段 解析为绝对路径。
    const routePath = path.resolve(basePath, item.path)
    //路由分离之和,可能存在 同名父路由情况
    let route = result.find(item => item.path === routePath)
    //判断当路由未加入result的时候
    if (!route) {
      //拿到最外层routes中的item
      route = {
        ...item,
        path:routePath,
        children:[]
      }
      //如果icon和title全部同时存在
      if(route.meta.icon && route.meta.title){
        result.push(route)
      }

      //存在children也存在meta  如果isNull函数返回的为true的时候才会是空对象 或者空字符 所以为false代表有children
      if(!isNull(item.children)){
        route.children.push(...generateMenus(item.children,route.path))
      }

    }
  })
  return result
}